In [1]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')

In [2]:
import os
import sys

CURRENT_DIR = os.path.abspath(os.path.dirname(__name__))
LIBRARY_DIR = os.path.join(CURRENT_DIR, '..', '..')

sys.path.append(LIBRARY_DIR)

In [11]:
import os

CURRENT_DIR = os.path.abspath(os.path.dirname(__name__))

def saveas(name):
    image_name = '{}.png'.format(name)
    image_path = os.path.join(LIBRARY_DIR, 'site', '2017', '12', '09', 'images', image_name)
    plt.savefig(image_path, facecolor='#f8fafb', bbox_inches='tight')

In [4]:
blue = '#348ABD'
red = '#E24A33'
black = '#000000'
purple = '#988ED5'
green = '#8EBA42'

In [5]:
from itertools import product

import numpy as np

from neupy.algorithms.competitive.neighbours import find_neighbours_on_rect_grid
from examples.competitive.utils import plot_2d_grid

grid = np.array(list(product(range(9), range(9))))

In [25]:
fig = plt.figure(figsize=(6, 6))
plt.title("SOFM grid")

plot_2d_grid(
    np.transpose(grid.reshape((9, 9, 2)), (2, 0, 1)),
    color=blue)

plt.scatter(*grid.T, color=blue)

plt.xlim(-1, 9)
plt.ylim(-1, 9)
    
plt.xticks([])
plt.yticks([])

saveas('sofm-grid')



In [12]:
fig = plt.figure(figsize=(13, 10))

for index, radius in enumerate(range(6), start=1):
    plt.subplot(2, 3, index)
    red, blue = ('#E24A33', '#348ABD')
    
    plt.title('2D 10x10 SOFM grid with \nlearning radius = {}'.format(radius))

    neuron_winner = (4, 4)
    neighbour = find_neighbours_on_rect_grid(
        np.zeros((9, 9)), neuron_winner, radius)
    neighbour = neighbour.ravel()

    plot_2d_grid(
        np.transpose(grid.reshape((9, 9, 2)), (2, 0, 1)),
        color=blue)

    plt.scatter(*grid[neighbour == 0].T, color=blue)
    plt.scatter(*grid[neighbour == 1].T, color=red, s=50, zorder=100)
    plt.scatter(*neuron_winner, color=red, s=100, zorder=100)

    plt.xlim(-1, 9)
    plt.ylim(-1, 9)
    
    plt.xticks([])
    plt.yticks([])

fig.tight_layout()
saveas('sofm-learning-radius-comparison')



In [13]:
from neupy import algorithms

fig = plt.figure(figsize=(15, 18))

for index, radius in enumerate(range(8), start=1):
    plt.subplot(4, 2, index)

    radius = radius // 2
    neuron_winner = (8, 4)

    if index % 2 == 1:
        plt.title('SOFM 10x10 feature map \nbefore training')
        current_grid = grid.copy()
    else:
        plt.title('SOFM 10x10 feature map \nafter training')
        sofm = algorithms.SOFM(
            n_inputs=2,
            step=0.4,
            features_grid=(9, 9),
            learning_radius=radius,
            std=1,
            weight=current_grid.T)
        
        sofm.train([[15, 4]], epochs=1)
        current_grid = sofm.weight.T

    neighbour = find_neighbours_on_rect_grid(
        np.zeros((9, 9)), neuron_winner, radius)
    neighbour = neighbour.ravel()

    plot_2d_grid(
        np.transpose(current_grid.reshape((9, 9, 2)), (2, 0, 1)),
        color=blue)

    plt.scatter(*current_grid[neighbour == 0].T, color=blue)
    plt.scatter(*current_grid[neighbour == 1].T, color=red, s=50, zorder=100)
    plt.scatter(15, 4, color='#000000', s=100)

    plt.xlim(-1, 17)
    plt.ylim(-1, 9)
    
    plt.xticks([])
    plt.yticks([])

fig.tight_layout()
saveas('sofm-training-learning-radius-comparison')